JavaScript์ ๊ธฐ๋ณธ BigInt๋ฅผ ์ฌ์ฉํ์ฌ ๋ณด์ ๋ฐ ์ฑ๋ฅ์ ํฅ์์์ผ ECDH, ๊ณต๊ฐ ํค ๋ณต๊ตฌ, Schnorr ์๋ช ๊ณผ ๊ฐ์ ๊ณ ๊ธ ํ์ ๊ณก์ ์ํธํ(ECC) ์ฐ์ฐ์ ํ์ํฉ๋๋ค.
JavaScript BigInt ํ์ ๊ณก์ ์ํธํ: ๊ณ ๊ธ ์ฐ์ฐ ์ฌ์ธต ๋ถ์
ํ์ค์ํ ๊ธ์ต(DeFi)์์ ์๋ ํฌ ์๋ ์ํธํ ๋ฉ์์ง์ ์ด๋ฅด๊ธฐ๊น์ง ๋์งํธ ์ํธ ์์ฉ์ด ์ง๋ฐฐํ๋ ์๋์ ์ํธํ ๊ธฐ๋ฐ์ ๊ฐ๋๋ ๊ทธ ์ด๋ ๋๋ณด๋ค ์ค์ํฉ๋๋ค. ํ์ ๊ณก์ ์ํธํ(ECC)๋ RSA์ ๊ฐ์ ์ด์ ์ ํ์ ๋นํด ๋ ์์ ํค ํฌ๊ธฐ๋ก ๊ฐ๋ ฅํ ๋ณด์์ ์ ๊ณตํ๋ ํ๋ ๊ณต๊ฐ ํค ์ํธํ์ ํต์ฌ์ ๋๋ค. ์๋ ๋์ ์ด๋ฌํ ๋ณต์กํ ์ํ ์ฐ์ฐ์ JavaScript์์ ์ง์ ์ํํ๋ ๊ฒ์ ์ด๋ ค์ด ์ผ์ด์์ต๋๋ค. ์ข ์ข ๋ฎ์ ์์ค์ ์ธ๋ถ ์ฌํญ์ ์ถ์ํํ๊ฑฐ๋ JavaScript ํ์ค ์ซ์ ์ ํ์ ์ ํ ์ฌํญ์ ์ฒ๋ฆฌํ๋ ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ์ต๋๋ค.
JavaScript(ES2020)์ ๊ธฐ๋ณธ BigInt ์ ํ์ด ๋์
๋ ๊ฒ์ ํ๋ช
์ ์ธ ์๊ฐ์ด์์ต๋๋ค. 64๋นํธ ๋ถ๋ ์์์ Number ์ ํ์ ์ ์ฝ์์ ๊ฐ๋ฐ์๋ฅผ ํด๋ฐฉ์์ผ ์์๋ก ํฐ ์ ์๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ต๋๋ค. ์ด ๋จ์ผ ๊ธฐ๋ฅ์ ๋ธ๋ผ์ฐ์ ๋ฐ Node.js์ ๊ฐ์ JavaScript ํ๊ฒฝ ๋ด์์ ์ง์ ์ํํ ์ ์๋ ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ , ๊ธฐ๋ณธ์ ์ด๋ฉฐ, ๋ ํฌ๋ช
ํ ์ํธํ ๊ตฌํ์ ์ ์ฌ๋ ฅ์ ์ด์์ต๋๋ค.
๋ง์ ๊ฐ๋ฐ์๊ฐ ํค ์ ์์ฑ ๋ฐ ๋ฉ์์ง ์๋ช
๊ณผ ๊ฐ์ ECC์ ๊ธฐ๋ณธ ์ฌํญ์ ์ต์ํ์ง๋ง ์ด ๊ธฐ์ ์ ์ง์ ํ ํ์ ๊ณ ๊ธ ์ฐ์ฐ์ ์์ต๋๋ค. ์ด ๊ธฐ์ฌ๋ ๊ธฐ๋ณธ ์ฌํญ์ ๋์ด BigInt ๋๋ถ์ ์ก์ธ์คํ ์ ์๋ ์ ๊ตํ ์ํธํ ํ๋กํ ์ฝ ๋ฐ ๊ธฐ์ ์ ํ์ํฉ๋๋ค. ๋ณด์ ํค ๊ตํ์ ์ํ ํ์ ๊ณก์ Diffie-Hellman(ECDH), ์๋ช
์์ ๊ณต๊ฐ ํค ๋ณต๊ตฌ, ๊ฐ๋ ฅํ๊ณ ์ง๊ณ ์นํ์ ์ธ Schnorr ์๋ช
์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
JavaScript ์ํธํ์ BigInt ํ๋ช
๊ณ ๊ธ ์ฐ์ฐ์ ์ดํด๋ณด๊ธฐ ์ ์ BigInt๊ฐ JavaScript ์ํธํ์ ์ ๊ทธ๋ ๊ฒ ์ค์ํ ๋ณํ๋ฅผ ๊ฐ์ ธ์ค๋์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
`Number` ์ ํ์ ๋ฌธ์ ์
JavaScript์ ๊ธฐ์กด Number ์ ํ์ IEEE 754 ๋ฐฐ์ ๋ฐ๋ 64๋นํธ ๋ถ๋ ์์์ ์ซ์์
๋๋ค. ์ด ํ์์ ๊ด๋ฒ์ํ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ํฉํ์ง๋ง ์ํธํ์ ๋ํ ์ค์ํ ์ ํ ์ฌํญ์ด ์์ต๋๋ค. Number.MAX_SAFE_INTEGER๊น์ง์ ์ ์๋ง ์์ ํ๊ฒ ๋ํ๋ผ ์ ์์ผ๋ฉฐ, ์ด๋ 253 - 1์
๋๋ค.
ECC์ ์ํธํ ํค์ ์ค๊ฐ ๊ฐ์ ํจ์ฌ ๋ ํฝ๋๋ค. ์๋ฅผ ๋ค์ด Bitcoin ๋ฐ Ethereum์์ ์ฌ์ฉํ๋ ์ธ๊ธฐ ์๋ secp256k1 ๊ณก์ ์ 256๋นํธ ๊ธธ์ด์ ์์ ํ๋์์ ์๋ํฉ๋๋ค. ์ด๋ฌํ ์ซ์๋ ํ์ค Number ์ ํ์ด ์ ๋ฐ๋ ์์ค ์์ด ์ฒ๋ฆฌํ ์ ์๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ํฝ๋๋ค. ์ด๋ฌํ ์ซ์๋ก ๊ณ์ฐ์ ์๋ํ๋ฉด ์๋ชป๋๊ณ ์์ ํ์ง ์์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํฉ๋๋ค.
`BigInt` ์ ๋ ฅ: ์์ ์ ๋ฐ๋ ์ ์
BigInt๋ ์ด ๋ฌธ์ ๋ฅผ ๊น๋ํ๊ฒ ํด๊ฒฐํฉ๋๋ค. ๋ชจ๋ ํฌ๊ธฐ์ ์ ์๋ฅผ ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ณ ์ ํ ์ซ์ ์ ํ์
๋๋ค. ์ ์ ๋ฆฌํฐ๋ด ๋์ `n`์ ์ถ๊ฐํ๊ฑฐ๋ BigInt() ์์ฑ์๋ฅผ ํธ์ถํ์ฌ BigInt๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์:
const aLargeNumber = 9007199254740991n; // BigInt๋ก ์์ ํจ
const anEvenLargerNumber = 115792089237316195423570985008687907853269984665640564039457584007908834671663n; // 256๋นํธ ์์
BigInt๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ค ์ฐ์ ์ฐ์ฐ์(+, -, *, /, %, **)๊ฐ ์ด๋ฌํ ๊ฑฐ๋ํ ์ ์์์ ์์๋๋ก ์๋ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ JavaScript ECC ๊ตฌํ์ด ๊ตฌ์ถ๋๋ ๊ธฐ๋ฐ์ด๋ฉฐ, ์ธ๋ถ WebAssembly ๋ชจ๋์ด๋ ๋ฒ๊ฑฐ๋ก์ด ๋ค์ค ํํธ ์ซ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ์ง ์๊ณ ๋ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ , ์ ํํ๊ฒ, ์์ ํ๊ฒ ๊ณ์ฐํ ์ ์์ต๋๋ค.
ํ์ ๊ณก์ ์ํธํ ๊ธฐ๋ณธ ์ฌํญ์ ๋ํ ๋ณต์ต
๊ณ ๊ธ ์ฐ์ฐ์ ์ดํดํ๋ ค๋ฉด ECC์ ํต์ฌ ๊ฐ๋ ์ ๊ฐ๋ตํ๊ฒ ๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ECC๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํ ํ๋์ ๋ํ ํ์ ๊ณก์ ์ ๋์ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ด๋ฌํ ๊ณก์ ์ Weierstrass ๋ฐฉ์ ์์ผ๋ก ์ ์๋ฉ๋๋ค.
y2 = x3 + ax + b (mod p)
์ฌ๊ธฐ์ `a`์ `b`๋ ๊ณก์ ์ ๋ชจ์์ ์ ์ํ๋ ์์์ด๊ณ , `p`๋ ์ ํ ํ๋๋ฅผ ์ ์ํ๋ ํฐ ์์์ ๋๋ค.
์ฃผ์ ๊ฐ๋
- ๊ณก์ ์์ ์ : ๊ณก์ ๋ฐฉ์ ์์ ๋ง์กฑํ๋ ์ขํ ์(x, y). ๋ชจ๋ ์ํธํ ์ฐ์ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก "์ ์ฐ์ "์ ๋๋ค.
- ๊ธฐ๋ณธ ์ (G): ๊ณต๊ฐ์ ์ผ๋ก ์๋ ค์ง ํ์คํ๋ ๊ณก์ ์์ ์์์ ์ ๋๋ค.
- ๊ฐ์ธ ํค(d): ๋งค์ฐ ํฌ๊ณ ์ํธํ ๋ฐฉ์์ผ๋ก ์์ ํ ์์ ์ ์์
๋๋ค. ์ด๊ฒ์ด ๋น์ ์ ๋น๋ฐ์
๋๋ค.
BigInt์ ์ปจํ ์คํธ์์ `d`๋ ํฐ `BigInt`์ ๋๋ค. - ๊ณต๊ฐ ํค(Q): ์ค์นผ๋ผ ๊ณฑ์ ์ด๋ผ๋ ์ฐ์ฐ์ ํตํด ๊ฐ์ธ ํค์ ๊ธฐ๋ณธ ์ ์ผ๋ก๋ถํฐ ํ์๋ ๊ณก์ ์์ ์ : Q = d * G. ์ด๋ ์ G๋ฅผ `d`๋ฒ ์์ ์๊ฒ ๋ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ECC์ ๋ณด์์ ํ์ ๊ณก์ ์ด์ฐ ๋ก๊ทธ ๋ฌธ์ (ECDLP)์ ๋ฌ๋ ค ์์ต๋๋ค. ๊ฐ์ธ ํค `d`์ ๊ธฐ๋ณธ ์ `G`๊ฐ ์ฃผ์ด์ง๋ฉด ๊ณต๊ฐ ํค `Q`๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ ๊ณ์ฐ์ ์ผ๋ก ์ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณต๊ฐ ํค `Q`์ ๊ธฐ๋ณธ ์ `G`๋ง์ผ๋ก๋ ๊ฐ์ธ ํค `d`๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ด ๊ณ์ฐ์ ์ผ๋ก ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๊ณ ๊ธ ์ฐ์ฐ 1: ํ์ ๊ณก์ Diffie-Hellman(ECDH) ํค ๊ตํ
ECC์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ์์ฉ ํ๋ก๊ทธ๋จ ์ค ํ๋๋ ์์ ํ์ง ์์ ํต์ ์ฑ๋์ ํตํด ๋ ๋น์ฌ์ ๊ฐ์ ๊ณต์ ๋น๋ฐ์ ์ค์ ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ํ์ ๊ณก์ Diffie-Hellman(ECDH) ํค ๊ตํ ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ๋ฌ์ฑ๋ฉ๋๋ค.
๋ชฉํ
์์ ํ๊ฒ ํต์ ํ๋ ค๋ Alice์ Bob์ด๋ผ๋ ๋ ์ฌ๋์ ์์ํด ๋ณด์ญ์์ค. ๊ทธ๋ค์ ์์ ๋ง ์๋ ๋์นญ ์ํธํ ํค์ ๋์ํด์ผ ํ์ง๋ง, ๊ทธ๋ค์ ์ ์ผํ ํต์ ์๋จ์ ์ฟ๋ฃ๋ ์ฌ๋ Eve๊ฐ ๋ชจ๋ํฐ๋งํ ์ ์๋ ๊ณต๊ฐ ์ฑ๋์ ๋๋ค. ECDH๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณต์ ๋น๋ฐ์ ์ง์ ์ ์กํ์ง ์๊ณ ๋ ๋์ผํ ๊ณต์ ๋น๋ฐ์ ๊ณ์ฐํ ์ ์์ต๋๋ค.
๋จ๊ณ๋ณ ํ๋กํ ์ฝ
- ํค ์์ฑ:
- Alice๋ ๊ฐ์ธ ํค `d_A`(ํฐ ์์
BigInt)์ ํด๋น ๊ณต๊ฐ ํค `Q_A = d_A * G`๋ฅผ ์์ฑํฉ๋๋ค. - Bob์ ๊ฐ์ธ ํค `d_B`(๋ค๋ฅธ ํฐ ์์
BigInt)์ ํด๋น ๊ณต๊ฐ ํค `Q_B = d_B * G`๋ฅผ ์์ฑํฉ๋๋ค.
- Alice๋ ๊ฐ์ธ ํค `d_A`(ํฐ ์์
- ๊ณต๊ฐ ํค ๊ตํ:
- Alice๋ ์์ ์ ๊ณต๊ฐ ํค `Q_A`๋ฅผ Bob์๊ฒ ๋ณด๋ ๋๋ค.
- Bob์ ์์ ์ ๊ณต๊ฐ ํค `Q_B`๋ฅผ Alice์๊ฒ ๋ณด๋ ๋๋ค.
- ์ฟ๋ฃ๋ ์ฌ๋ Eve๋ `Q_A`์ `Q_B`๋ฅผ ๋ชจ๋ ๋ณผ ์ ์์ง๋ง ECDLP ๋๋ฌธ์ ๊ฐ์ธ ํค `d_A` ๋๋ `d_B`๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
- ๊ณต์ ๋น๋ฐ ๊ณ์ฐ:
- Alice๋ Bob์ ๊ณต๊ฐ ํค `Q_B`๋ฅผ ๊ฐ์ ธ์ ์์ ์ ๊ฐ์ธ ํค `d_A`๋ฅผ ๊ณฑํ์ฌ ์ S๋ฅผ ์ป์ต๋๋ค. S = d_A * Q_B.
- Bob์ Alice์ ๊ณต๊ฐ ํค `Q_A`๋ฅผ ๊ฐ์ ธ์ ์์ ์ ๊ฐ์ธ ํค `d_B`๋ฅผ ๊ณฑํ์ฌ ์ S๋ฅผ ์ป์ต๋๋ค. S = d_B * Q_A.
๊ตํ์ฑ์ ๋ง๋ฒ
Alice์ Bob์ ๋ชจ๋ ๊ณก์ ์์ ์ ํํ ๋์ผํ ๋น๋ฐ ์ `S`์ ๋๋ฌํฉ๋๋ค. ์ด๋ ์ค์นผ๋ผ ๊ณฑ์ ์ด ๊ฒฐํฉ์ ์ด๊ณ ๊ตํ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
Alice์ ๊ณ์ฐ: S = d_A * Q_B = d_A * (d_B * G)
Bob์ ๊ณ์ฐ: S = d_B * Q_A = d_B * (d_A * G)
d_A * d_B * G = d_B * d_A * G์ด๋ฏ๋ก ๊ฐ์ธ ํค๋ฅผ ๊ณต๊ฐํ์ง ์๊ณ ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
๊ณต์ ์ ์์ ๋์นญ ํค๋ก
๊ฒฐ๊ณผ ๊ณต์ ๋น๋ฐ `S`๋ AES์ ๊ฐ์ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ ํฉํ ๋์นญ ํค๊ฐ ์๋ ๊ณก์ ์์ ์ ์ ๋๋ค. ํค๋ฅผ ํ์ํ๊ธฐ ์ํด ํ์ค ๋ฐฉ์์ ์ `S`์ x์ขํ๋ฅผ ๊ฐ์ ธ์ HKDF(HMAC ๊ธฐ๋ฐ ํค ํ์ ํจ์)์ ๊ฐ์ ํค ํ์ ํจ์(KDF)๋ฅผ ํตํด ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค. KDF๋ ๊ณต์ ๋น๋ฐ๊ณผ ์ ํ์ ์ผ๋ก ์ํธ ๋ฐ ๊ธฐํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ์ํ๋ ๊ธธ์ด์ ์ํธํ ๋ฐฉ์์ผ๋ก ๊ฐ๋ ฅํ ํค๋ฅผ ์์ฑํฉ๋๋ค.
๊ธฐ๋ณธ ๊ณ์ฐ(์์ `BigInt`๋ก ๊ฐ์ธ ํค ์์ฑ ๋ฐ ์ค์นผ๋ผ ๊ณฑ์ ์ํ)์ ๋ชจ๋ `BigInt` ์ฐ์ ์ ํฌ๊ฒ ์์กดํฉ๋๋ค.
๊ณ ๊ธ ์ฐ์ฐ 2: ์๋ช ์์ ๊ณต๊ฐ ํค ๋ณต๊ตฌ
๋ง์ ์์คํ , ํนํ ๋ธ๋ก์ฒด์ธ์์๋ ํจ์จ์ฑ๊ณผ ๋ฐ์ดํฐ ์ต์ํ๊ฐ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๋ช ์ ํ์ธํ๋ ค๋ฉด ๋ฉ์์ง, ์๋ช ์์ฒด ๋ฐ ์๋ช ์์ ๊ณต๊ฐ ํค๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ์ ๊ณก์ ๋์งํธ ์๋ช ์๊ณ ๋ฆฌ์ฆ(ECDSA)์ ์๋ฆฌํ ์์ฑ์ ์ฌ์ฉํ๋ฉด ๋ฉ์์ง์ ์๋ช ์์ ์ง์ ๊ณต๊ฐ ํค๋ฅผ ๋ณต๊ตฌํ ์ ์์ต๋๋ค. ์ฆ, ๊ณต๊ฐ ํค๋ฅผ ์ ์กํ ํ์๊ฐ ์์ด ๊ท์คํ ๊ณต๊ฐ์ ์ ์ฝํ ์ ์์ต๋๋ค.
์๋ ๋ฐฉ์(๊ฐ๋ต์ ์ธ ์์ค)
ECDSA ์๋ช ์ ๋ ๊ฐ์ ๊ตฌ์ฑ ์์( r`, `s`)๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- `r`์ ์์ ์ `k * G`์ x์ขํ์์ ํ์๋ฉ๋๋ค.
- `s`๋ ๋ฉ์์ง ํด์(`z`), ๊ฐ์ธ ํค(`d`) ๋ฐ `r`์ ๊ธฐ๋ฐ์ผ๋ก ๊ณ์ฐ๋ฉ๋๋ค. ๊ณต์์ `s = k_inverse * (z + r * d) mod n`์ ๋๋ค. ์ฌ๊ธฐ์ `n`์ ๊ณก์ ์ ์์์ ๋๋ค.
์๋ช ํ์ธ ๋ฐฉ์ ์์ ๋์ ์กฐ์์ ํตํด ๊ณต๊ฐ ํค `Q`์ ๋ํ ํํ์์ ํ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ํ๋ก์ธ์ค๋ ๋ ๊ฐ์ ๊ฐ๋ฅํ ์ ํจํ ๊ณต๊ฐ ํค๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฌํ ๋ชจํธ์ฑ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ณต๊ตฌ ID(์ข ์ข `v` ๋๋ `recid`๋ก ํ์๋จ)๋ผ๋ ์์ ์ถ๊ฐ ์ ๋ณด๊ฐ ์๋ช ์ ํฌํจ๋ฉ๋๋ค. ์ด ID(์ผ๋ฐ์ ์ผ๋ก 0, 1, 2 ๋๋ 3)๋ ๊ฐ๋ฅํ ์๋ฃจ์ ์ค ์ฌ๋ฐ๋ฅธ ์๋ฃจ์ ์ ์ง์ ํ๊ณ ํค์ y์ขํ๊ฐ ์ง์์ธ์ง ํ์์ธ์ง ์ง์ ํฉ๋๋ค.
`BigInt`๊ฐ ํ์์ ์ธ ์ด์
๊ณต๊ฐ ํค ๋ณต๊ตฌ์ ํ์ํ ์ํ ์ฐ์ฐ์ ์ง์ฝ์ ์ด๋ฉฐ ๋ชจ๋์ ์ญํจ์, ๊ณฑ์ ๋ฐ 256๋นํธ ์ซ์์ ๋ง์ ์ด ํฌํจ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฃผ์ ๋จ๊ณ์๋ `(r_inverse * (s*k - z)) * G` ๊ณ์ฐ์ด ํฌํจ๋ฉ๋๋ค. ์ด๋ฌํ ์ฐ์ฐ์ `BigInt`๊ฐ ์ค๊ณ๋ ๋ฐ๋ก ๊ทธ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ JavaScript์์ ์ด๋ฌํ ๊ณ์ฐ์ ์ํํ๋ ๊ฒ์ ์ ๋ฐ๋์ ๋ณด์์ ์๋นํ ์์ค ์์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ค์ ์์ฉ ํ๋ก๊ทธ๋จ: Ethereum ํธ๋์ญ์
์ด ๊ธฐ์ ์ Ethereum์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ช ๋ ํธ๋์ญ์ ์๋ ๋ฐ์ ์์ ๊ณต๊ฐ ์ฃผ์๊ฐ ์ง์ ํฌํจ๋์ด ์์ง ์์ต๋๋ค. ๋์ ์ฃผ์(๊ณต๊ฐ ํค์์ ํ์๋จ)๋ ์๋ช ์ `v`, `r` ๋ฐ `s` ๊ตฌ์ฑ ์์์์ ๋ณต๊ตฌ๋ฉ๋๋ค. ์ด ๋์์ธ ์ ํ์ ๋ชจ๋ ๋จ์ผ ํธ๋์ญ์ ์์ 20๋ฐ์ดํธ๋ฅผ ์ ์ฝํ๋ฉฐ ๊ธ๋ก๋ฒ ๋ธ๋ก์ฒด์ธ ๊ท๋ชจ์์ ์๋นํ ์ ์ฝ์ ๋๋ค.
๊ณ ๊ธ ์ฐ์ฐ 3: Schnorr ์๋ช ๋ฐ ์ง๊ณ
ECDSA๊ฐ ๋๋ฆฌ ์ฌ์ฉ๋์ง๋ง ์๋ช ๋ณ์กฐ ๊ฐ๋ฅ์ฑ ๋ฐ ์ง๊ณ ์์ฑ ๋ถ์กฑ์ ํฌํจํ์ฌ ํน์ ๋จ์ ์ด ์์ต๋๋ค. ๋ ๋ค๋ฅธ ECC ๊ธฐ๋ฐ ์ฒด๊ณ์ธ Schnorr ์๋ช ์ ์ด๋ฌํ ๋ฌธ์ ์ ๋ํ ๊น๋ํ ์๋ฃจ์ ์ ์ ๊ณตํ๋ฉฐ ๋ง์ ์ํธํ ์ ๋ฌธ๊ฐ๊ฐ ๋ ์ฐ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Schnorr ์๋ช ์ ์ฃผ์ ์ฅ์
- ์ฆ๋ช ๊ฐ๋ฅํ ๋ณด์: ECDSA์ ๋นํด ๋ ๊ฐ๋จํ๊ณ ๊ฐ๋ ฅํ ๋ณด์ ์ฆ๋ช ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ๋ณ์กฐ ๋ถ๊ฐ๋ฅ์ฑ: ์ 3์๊ฐ ๋์ผํ ๋ฉ์์ง์ ํค์ ๋ํด ์ ํจํ ์๋ช ์ ๋ค๋ฅธ ์ ํจํ ์๋ช ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ์ ํ์ฑ(์ด๋ฅ๋ ฅ): ์ด๊ฒ์ด ๊ฐ์ฅ ์ค์ํ ์ฅ์ ์ ๋๋ค. Schnorr ์๋ช ์ ์ ํ์ ์ด๋ฏ๋ก ๊ฐ๋ ฅํ ์ง๊ณ ๊ธฐ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ช ์ง๊ณ ์ค๋ช
์ ํ์ฑ ์์ฑ์ ์ฌ๋ฌ ์๋ช ์์ ์ฌ๋ฌ ์๋ช ์ ๋จ์ผํ๊ณ ๊ฐ๊ฒฐํ ์๋ช ์ผ๋ก ๊ฒฐํฉํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๋ค์ค ์๋ช (multisig) ์ฒด๊ณ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
ํธ๋์ญ์ ์ 5๋ช ์ ์ฐธ๊ฐ์ ์ค 3๋ช ์ ์๋ช ์ด ํ์ํ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ECDSA๋ฅผ ์ฌ์ฉํ๋ฉด ๋ธ๋ก์ฒด์ธ์ ์ธ ๊ฐ์ ๊ฐ๋ณ ์๋ช ์ ๋ชจ๋ ํฌํจํด์ผ ํ๋ฏ๋ก ์๋นํ ๊ณต๊ฐ์ ์ฐจ์งํฉ๋๋ค.
Schnorr ์๋ช ์ ์ฌ์ฉํ๋ฉด ํ๋ก์ธ์ค๊ฐ ํจ์ฌ ๋ ํจ์จ์ ์ ๋๋ค.
- ํค ์ง๊ณ: 3๋ช ์ ์ฐธ๊ฐ์๋ ๊ฐ๋ณ ๊ณต๊ฐ ํค(`Q1`, `Q2`, `Q3`)๋ฅผ ๊ฒฐํฉํ์ฌ ๋จ์ผ ์ง๊ณ ๊ณต๊ฐ ํค(`Q_agg`)๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
- ์๋ช ์ง๊ณ: MuSig2์ ๊ฐ์ ํ์ ํ๋กํ ์ฝ์ ํตํด ์ฐธ๊ฐ์๋ ์ง๊ณ ๊ณต๊ฐ ํค `Q_agg`์ ์ ํจํ ๋จ์ผ ์ง๊ณ ์๋ช (`S_agg`)์ ๋ง๋ค ์ ์์ต๋๋ค.
๊ฒฐ๊ณผ๋ ์ธ๋ถ์์ ํ์ค ๋จ์ผ ์๋ช ์ ํธ๋์ญ์ ๊ณผ ๋์ผํ๊ฒ ๋ณด์ด๋ ํธ๋์ญ์ ์ ๋๋ค. ํ๋์ ๊ณต๊ฐ ํค์ ํ๋์ ์๋ช ์ด ์์ต๋๋ค. ์ด๋ ๋ณต์กํ ๋ค์ค ์๋ช ์ค์ ์ด ๊ฐ๋จํ ์ค์ ๊ณผ ๊ตฌ๋ณํ ์ ์๊ฒ ๋๋ฏ๋ก ํจ์จ์ฑ, ํ์ฅ์ฑ ๋ฐ ๊ฐ์ธ ์ ๋ณด๋ฅผ ํ๊ธฐ์ ์ผ๋ก ํฅ์์ํต๋๋ค.
`BigInt`์ ์ญํ
์ง๊ณ์ ๋ง๋ฒ์ ๋จ์ํ ํ์ ๊ณก์ ์ ๋ง์ ๊ณผ ์ค์นผ๋ผ ์ฐ์ ์ ๋ฟ๋ฆฌ๋ฅผ ๋๊ณ ์์ต๋๋ค. ์ง๊ณ ํค๋ฅผ ๋ง๋๋ ๊ฒ์๋ `Q_agg = Q1 + Q2 + Q3`๊ฐ ํฌํจ๋๊ณ , ์ง๊ณ ์๋ช ์ ๋ง๋๋ ๊ฒ์๋ ๊ณก์ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ๋ณ ์๋ช ๊ตฌ์ฑ ์์๋ฅผ ๋ํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. MuSig2์ ๊ฐ์ ํ๋กํ ์ฝ์ ๊ธฐ๋ฐ์ ํ์ฑํ๋ ์ด๋ฌํ ๋ชจ๋ ์ฐ์ฐ์ ํฐ ์ ์์ ๊ณก์ ์ขํ์์ ์ํ๋๋ฏ๋ก `BigInt`๋ JavaScript์์ Schnorr ์๋ช ๋ฐ ์ง๊ณ ์ฒด๊ณ๋ฅผ ๊ตฌํํ๋ ๋ฐ ์์ด์๋ ์ ๋ ๋๊ตฌ์ ๋๋ค.
๊ตฌํ ๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก
`BigInt`๋ฅผ ํตํด ์ด๋ฌํ ๊ณ ๊ธ ์ฐ์ฐ์ ์ดํดํ๊ณ ๊ตฌํํ ์ ์์ง๋ง ํ๋ก๋์ ๋ฑ๊ธ ์ํธํ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ์ํํ ์์ ์ ๋๋ค. ๋ช ๊ฐ์ง ์ค์ํ ๊ณ ๋ ค ์ฌํญ์ด ์์ต๋๋ค.
1. ํ๋ก๋์ ์ ์ํด ์ง์ ์ํธํ๋ฅผ ๋กค๋งํ์ง ๋ง์ญ์์ค.
์ด ๊ธฐ์ฌ๋ ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ ๊ต์กํ๊ณ ์ค๋ช ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ํ๋ก๋์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ํด ์ด๋ฌํ ์ํธํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์ฒ์๋ถํฐ ๊ตฌํํด์๋ ์ ๋ ์ ๋ฉ๋๋ค. `noble-curves`์ ๊ฐ์ด ์ ๊ฒ์ฆ๋๊ณ ๊ฐ์ฌ๋ฅผ ๋ฐ๊ณ ๋๋ฃ ๊ฒํ ๋ฅผ ๊ฑฐ์น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ๋ฌธ๊ฐ๊ฐ ํน์ ์ฉ๋๋ก ๊ตฌ์ถํ๊ณ ์๋ง์ ๋ฏธ๋ฌํ์ง๋ง ์ค์ํ ๋ณด์ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํฉ๋๋ค.
2. ์์ ์๊ฐ ์ฐ์ฐ ๋ฐ ์ธก๋ฉด ์ฑ๋ ๊ณต๊ฒฉ
๊ฐ์ฅ ์ํํ ํจ์ ์ค ํ๋๋ ์ธก๋ฉด ์ฑ๋ ๊ณต๊ฒฉ์ ๋๋ค. ๊ณต๊ฒฉ์๋ ์์คํ ์ ๋น๊ธฐ๋ฅ์ ์ธก๋ฉด(์: ์ ๋ ฅ ์๋น ๋๋ ์ฐ์ฐ์ ๊ฑธ๋ฆฌ๋ ์ ํํ ์๊ฐ)์ ๋ถ์ํ์ฌ ๋น๋ฐ ํค์ ๋ํ ์ ๋ณด๋ฅผ ๋์ถํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํค์ '1' ๋นํธ๊ฐ ์๋ ๊ณฑ์ ์ด '0' ๋นํธ๊ฐ ์๋ ๊ณฑ์ ๋ณด๋ค ์ฝ๊ฐ ๋ ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ ๊ณต๊ฒฉ์๋ ํ์ด๋ฐ ๋ณ๋์ ๊ด์ฐฐํ์ฌ ํค๋ฅผ ์ฌ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
JavaScript์ ํ์ค `BigInt` ์ฐ์ฐ์ ์์ ์๊ฐ์ด ์๋๋๋ค. ์คํ ์๊ฐ์ ํผ์ฐ์ฐ์์ ๊ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ ๋ฌธ ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ์ธ ํค์ ๊ด๋ จ๋ ๋ชจ๋ ์ฐ์ฐ์ด ํค ๊ฐ์ ๊ด๊ณ์์ด ์ผ์ ํ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ก ๋ณด์ฅํ๊ธฐ ์ํด ๊ณ ๋๋ก ์ ๋ฌธํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ํ์ ์ํํฉ๋๋ค.
3. ๋ณด์ ๋๋ค ์ซ์ ์์ฑ
๋ชจ๋ ์ํธํ ์์คํ ์ ๋ณด์์ ๋๋ค์ฑ์ ํ์ง์์ ์์๋ฉ๋๋ค. ๊ฐ์ธ ํค๋ ์ํธํ ๋ฐฉ์์ผ๋ก ์์ ํ ์์ฌ ๋์ ์์ฑ๊ธฐ(CSPRNG)๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํด์ผ ํฉ๋๋ค. JavaScript ํ๊ฒฝ์์๋ ํญ์ ๊ธฐ๋ณธ ์ ๊ณต API๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ๋ธ๋ผ์ฐ์ :
crypto.getRandomValues() - Node.js:
crypto.randomBytes()
์์ธกํ ์ ์๋๋ก ์ค๊ณ๋์ง ์์์ผ๋ฏ๋ก ์ํธํ ๋ชฉ์ ์ผ๋ก `Math.random()`์ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
4. ๋๋ฉ์ธ ๋งค๊ฐ๋ณ์ ๋ฐ ๊ณต๊ฐ ํค ์ ํจ์ฑ ๊ฒ์ฌ
์ธ๋ถ ์์ค์์ ๊ณต๊ฐ ํค๋ฅผ ์์ ํ ๋๋ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ณต๊ฒฉ์๋ ์ค์ ๋ก ์ง์ ๋ ํ์ ๊ณก์ ์ ์๋ ์ ์ฑ ์ ์ ์ ๊ณตํ ์ ์์ผ๋ฉฐ, ์ด๋ก ์ธํด ECDH ํค ๊ตํ ์ค์ ๊ฐ์ธ ํค๋ฅผ ๊ณต๊ฐํ๋ ๊ณต๊ฒฉ(์: ์๋ชป๋ ๊ณก์ ๊ณต๊ฒฉ)์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ํํ์ด ์ข์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
๊ฒฐ๋ก
`BigInt`์ ๋ฑ์ฅ์ผ๋ก JavaScript ์ํ๊ณ ๋ด ์ํธํ ํ๊ฒฝ์ด ๊ทผ๋ณธ์ ์ผ๋ก ๋ฐ๋์์ต๋๋ค. ECC๋ ๋ถํฌ๋ช ํ ๋ธ๋ ๋ฐ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ญ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌํํ๊ณ ์ดํดํ ์ ์๋ ๊ฒ์ผ๋ก ์ด๋ํ์ฌ ์๋ก์ด ์์ค์ ํฌ๋ช ์ฑ๊ณผ ๊ธฐ๋ฅ์ ์กฐ์ฑํ์ต๋๋ค.
์ด ๋จ์ผ ๊ธฐ๋ฅ์ด ์ต์ ๋ณด์ ์์คํ ์ ํต์ฌ์ธ ๊ณ ๊ธ์ ๊ฐ๋ ฅํ ์ํธํ ์ฐ์ฐ์ ์ด๋ป๊ฒ ๊ฐ๋ฅํ๊ฒ ํ๋์ง ์ดํด๋ณด์์ต๋๋ค.
- ECDH ํค ๊ตํ: ๋ณด์ ํต์ ์ฑ๋์ ์ค์ ํ๊ธฐ ์ํ ๊ธฐ๋ฐ.
- ๊ณต๊ฐ ํค ๋ณต๊ตฌ: ๋ธ๋ก์ฒด์ธ๊ณผ ๊ฐ์ ํ์ฅ ๊ฐ๋ฅํ ์์คํ ์ ์ค์ํ ํจ์จ์ฑ ํฅ์ ๊ธฐ์ .
- Schnorr ์๋ช : ์ง๊ณ๋ฅผ ํตํด ์ฐ์ํ ํจ์จ์ฑ, ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๋ฐ ํ์ฅ์ฑ์ ์ ๊ณตํ๋ ์ฐจ์ธ๋ ์๋ช ์ฒด๊ณ.
๊ฐ๋ฐ์ ๋ฐ ์ค๊ณ์๋ก์ ์ด๋ฌํ ๊ณ ๊ธ ๊ฐ๋ ์ ์ดํดํ๋ ๊ฒ์ ๋ ์ด์ ํ๋ฌธ์ ์ฐ์ต์ด ์๋๋๋ค. ์ด๋ ์ค๋๋ Bitcoin์ Taproot ์ ๊ทธ๋ ์ด๋์์ ์ผ์์ ์ธ ๋ํ๋ฅผ ๋ณดํธํ๋ ๋ณด์ ๋ฉ์์ง ํ๋กํ ์ฝ์ ์ด๋ฅด๊ธฐ๊น์ง ๊ธ๋ก๋ฒ ์์คํ ์ ๋ฐฐํฌ๋๊ณ ์์ต๋๋ค. ์ต์ข ๊ตฌํ์ ํญ์ ๊ฐ์ฌ๋ฅผ ๋ฐ๊ณ ์ ๋ฌธ๊ฐ๊ฐ ๊ฒํ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋งก๊ฒจ์ผ ํ์ง๋ง, `BigInt`์ ๊ฐ์ ๋๊ตฌ๋ฅผ ํตํด ๊ฐ๋ฅํด์ง ๋ฉ์ปค๋์ฆ์ ๋ํ ๊น์ ์ดํด๋ ๊ธ๋ก๋ฒ ์ฒญ์ค์ ์ํด ๋์ฑ ์์ ํ๊ณ ํจ์จ์ ์ด๋ฉฐ ํ์ ์ ์ธ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.